/**
 * @file server.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2023-07-05
 *
 * @copyright Copyright (c) 2023
 * @note 当server调用过listen后，client就可以成功connect。server可以在这之后再调用accept并返回。
        backlog的意义就是：最多可以有多少个未accept的的connect。（实测未accept的connect数量为backlog + 1，
        例如listen(listen_fd, 0)可以有最多1个client connect成功，
        listen(listen_fd, 1)可以有最多2个client connect成功，
        listen(listen_fd, 5)可以有最多6个client connect成功）。
        超过这个数值之后，client的connect会阻塞。直到server调用了accept后，client connect才会从阻塞中返回。
        但并不是server accept之后，client connect就会立即返回，实测会有几秒钟的延迟。
 *
 */

#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server_address.sin_family = AF_INET;
    //注意：inet_addr返回的已经是按照网络字节序存储的网络地址了，所以不能再加htonl了
    server_address.sin_addr.s_addr = inet_addr("192.168.33.205");
    server_address.sin_port = htons(1111);
    server_len = sizeof(server_address);
    bind(server_sockfd, (struct sockaddr*)&server_address, server_len);

    printf("bind .....\n");
    sleep(10);

    listen(server_sockfd, 3);
    printf("server waiting...\n");
    sleep(10);

    while (1)
    {
        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len);
        printf("accept return %d\n", client_sockfd);
        sleep(10);
    }

    return 0;
}
